package br.com.devteam.sgap.view.interno;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;

import br.com.devteam.base.util.AlternativasCorretas;
import br.com.devteam.base.util.Message;
import br.com.devteam.base.util.SGAPContantes;
import br.com.devteam.sgap.model.Questao;
import br.com.devteam.sgap.model.Tema;
import br.com.devteam.sgap.service.IService;

@Controller(value = "MBeanManterQuestao")
@Scope(value = "session")
public class MBeanManterQuestao {
	
	@Autowired
	private IService service;

	private Questao questao;
	private List<Questao> questoes;
	
	private Tema tema;
	private List<Tema> temas;
	
	//private List<RespostaCerta> listRespostaCertas;
	//private RespostaCerta respostaCerta;
	
	private List<AlternativasCorretas> listAlternativasCorretas;
	private AlternativasCorretas alternativasCorretas;
	
	private boolean cadastrando;
	private String busca;
	
	public MBeanManterQuestao() {
	}
	
	public String actionCarregarFiltro() {

		try {
			busca = new String();
			carregarQuestoes();
		} catch (Exception e) {
			e.printStackTrace();
			Message.e(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ERROR_GENERIC);
			Message.manterMensagensRedirect();
		}

		return SGAPContantes.PAGE_FILTER_QUESTOES;
	}
	
	public String actionPrepararCadastro() {
		questao = new Questao();
		busca = new String();
		tema = null;
		//respostaCerta = null;

		cadastrando = true;
		
		return SGAPContantes.PAGE_REGISTER_QUESTOES;
	}
	
	private void carregarQuestoes() throws Exception {
		questoes = service.findByNamedQuery(Questao.QUERY_LIST_ASC_ORDER);
		temas = service.findByNamedQuery(Tema.QUERY_LIST_ASC_ORDER);
		//listRespostaCertas = service.findByNamedQuery(RespostaCerta.QUERY_LIST_ASC_ORDER);
	}
	
	@Transactional
	public String actionSalvar() {

		if (validar()) {
			try {
				questao.setTema(tema);
				//questao.setCerta(respostaCerta);
				//questao.setCorreta(alternativasCorretas);
				if (isCadastrando()) {
					service.save(questao);
					Message.i(SGAPContantes.MESSAGE_FIELD,
							SGAPContantes.ENTRY_SAVE);
					Message.manterMensagensRedirect();
				} else {
					service.update(questao);
					Message.i(SGAPContantes.MESSAGE_FIELD,
							SGAPContantes.ENTRY_UPDATE);
					Message.manterMensagensRedirect();
				}
				cadastrando = false;

				carregarQuestoes();

				return SGAPContantes.PAGE_FILTER_QUESTOES;
			} catch (Exception e) {
				e.printStackTrace();
				Message.e(SGAPContantes.MESSAGE_FIELD,
						SGAPContantes.ERROR_GENERIC);
			}
		}
		busca = new String();
		return "";
	}
	
	@Transactional
	public String actionExcluir(Questao questao) {
		try {
			questao = service.findById(Questao.class, questao.getId());
			service.delete(questao);
			Message.i(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ENTRY_DELETE);
			Message.manterMensagensRedirect();
			return actionCarregarFiltro();
		} catch (Exception e) {
			e.printStackTrace();
			Message.e(SGAPContantes.MESSAGE_FIELD,
					SGAPContantes.ERROR_NOT_DELETED);
		}

		return "";
	}
	
	public String actionEditar(Questao questao) {
		this.questao = questao;
		tema = questao.getTema();
		//respostaCerta = questao.getCerta();
		cadastrando = false;
		return SGAPContantes.PAGE_REGISTER_QUESTOES;
	}
	
	public String actionPesquisar() throws Exception {
		if (busca == null || busca.isEmpty()) {
			carregarQuestoes();
		} else if (busca.length() < 2) {
			Message.e(SGAPContantes.MESSAGE_FIELD,
					SGAPContantes.ERROR_SHORT_SEARCH);
		} else {
			Map<String, Object> params = new HashMap<String, Object>();
			params.put("busca", "%" + busca + "%");

			questoes = service.findByNamedQuery(Questao.QUERY_SEARCH, params);

			if (questoes.size() == 0) {
				Message.e(SGAPContantes.MESSAGE_FIELD,
						SGAPContantes.ERROR_SEARCH_NO_DATA);
			}
		}
		return "";
	}
	
	public String actionCancelarCadastro() throws Exception {
		questao = new Questao();
		cadastrando = false;
		tema = new Tema();
		temas = new ArrayList<Tema>();
		carregarQuestoes();
		return "/pages/interno/questoes/questoes_filtro.xhtml?faces-redirect=true";//SGAPContantes.PAGE_FILTER_USUARIO;
	}
	
	private boolean validar() {
		boolean retorno = true;
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("pergunta", questao.getPergunta());
		List<Questao> listQuestoes = service.findByNamedQuery(Questao.QUERY_PERGUNTA, params);

		if (!listQuestoes.isEmpty()) {
			if (questao.getPergunta().equals(listQuestoes.get(0).getPergunta()) && cadastrando == true ) {
				retorno = false;
				Message.e("pergunta", SGAPContantes.ERROR_FORM_FIELD_PERGUNTA);
			}
		}

		if (questao.getPergunta() == null || questao.getPergunta().length() < 1) {
			retorno = false;
			Message.e("pergunta", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}

		if (questao.getAlternativaA() == null || questao.getAlternativaA().length() < 1) {
			retorno = false;
			Message.e("alternativaA", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}
		
		if (questao.getAlternativaB() == null || questao.getAlternativaB().length() < 1) {
			retorno = false;
			Message.e("alternativaB", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}
		
		if (questao.getAlternativaC() == null || questao.getAlternativaC().length() < 1) {
			retorno = false;
			Message.e("alternativaC", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}
		
		if (questao.getAlternativaD() == null || questao.getAlternativaD().length() < 1) {
			retorno = false;
			Message.e("alternativaD", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}

		/*if (tema == null) {
			retorno = false;
			Message.e("tema", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}*/
		
		/*if (respostaCerta == null) {
			retorno = false;
			Message.e("correta", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}*/

		if (!retorno) {
			Message.e(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ERROR_GENERIC);
		}

		return retorno;
	}

	public Questao getQuestao() {
		if (questao == null) {
			questao = new Questao();
		}
		return questao;
	}

	public void setQuestao(Questao questao) {
		this.questao = questao;
	}

	public List<Questao> getQuestoes() {
		if (questoes == null) {
			questoes = new ArrayList<Questao>();
		}
		return questoes;
	}

	public void setQuestoes(List<Questao> questoes) {
		this.questoes = questoes;
	}

	public boolean isCadastrando() {
		return cadastrando;
	}

	public void setCadastrando(boolean cadastrando) {
		this.cadastrando = cadastrando;
	}

	public String getBusca() {
		return busca;
	}

	public void setBusca(String busca) {
		this.busca = busca;
	}

	public Tema getTema() {
		if (tema == null) {
			tema = new Tema();
		}
		return tema;
	}

	public void setTema(Tema tema) {
		this.tema = tema;
	}

	public List<Tema> getTemas() {
		if (temas == null) {
			temas = new ArrayList<Tema>();
		}
		return temas;
	}

	public void setTemas(List<Tema> temas) {
		this.temas = temas;
	}

	/*public List<RespostaCerta> getListRespostaCertas() {
		return listRespostaCertas;
	}

	public void setListRespostaCertas(List<RespostaCerta> listRespostaCertas) {
		this.listRespostaCertas = listRespostaCertas;
	}

	public RespostaCerta getRespostaCerta() {
		if (respostaCerta == null) {
			respostaCerta = new RespostaCerta();
		}
		return respostaCerta;
	}

	public void setRespostaCerta(RespostaCerta respostaCerta) {
		this.respostaCerta = respostaCerta;
	}*/

	public List<AlternativasCorretas> getListAlternativasCorretas() {
		if (listAlternativasCorretas == null || listAlternativasCorretas.isEmpty()) {
			listAlternativasCorretas = new ArrayList<AlternativasCorretas>();
			for (AlternativasCorretas alternativaCorreta : AlternativasCorretas.values()) {
				listAlternativasCorretas.add(alternativaCorreta);
			}
		}
		return listAlternativasCorretas;
	}

	public void setListAlternativasCorretas(List<AlternativasCorretas> listAlternativasCorretas) {
		this.listAlternativasCorretas = listAlternativasCorretas;
	}

	public AlternativasCorretas getAlternativasCorretas() {
		return alternativasCorretas;
	}

	public void setAlternativasCorretas(AlternativasCorretas alternativasCorretas) {
		this.alternativasCorretas = alternativasCorretas;
	}

}
